package org.liaoxuefeng.study;

import lombok.val;
import org.testng.annotations.Test;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author: 默苍璃
 * @date: 2022-09-28 16:48
 * JDBC更新操作
 * 使用JDBC执行INSERT、UPDATE和DELETE都可视为更新操作；
 */
public class JDBCUpdate {

    /**
     * JDBC连接的URL, 不同数据库有不同的格式:
     */
    final String JDBC_URL = "jdbc:mysql://localhost/jdbc?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
    final String JDBC_USER = "root";
    final String JDBC_PASSWORD = "root";


    /**
     * 插入一条数据
     */
    @Test
    public void test() throws SQLException {
        //获取连接
        val connection = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
        //插入sql语句
        String sql = "insert into students  (grade, name, gender ,score) values(?,?,?,?)";
        //创建预编译声明
        val preparedStatement = connection.prepareStatement(sql);
        //给查询条件赋值   索引从1开始
        preparedStatement.setObject(1, (byte) 3);
        preparedStatement.setObject(2, "俞家伟");
        preparedStatement.setObject(3, 2);
        preparedStatement.setObject(4, 100);

        //执行插入sql语句(不用传参数)
        val result = preparedStatement.executeUpdate();

        //打印返回数据（插入的记录数量）
        System.out.println(result);

        preparedStatement.close();
        connection.close();
    }


    /**
     * 插入一条数据 并且返回主键
     */
    @Test
    public void test1() throws SQLException {
        //获取连接
        val connection = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
        //插入sql语句
        String sql = "insert into students  (grade, name, gender ,score) values(?,?,?,?)";
        //创建预编译声明，增加主键标志位
        val preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        //给查询条件赋值   索引从1开始
        preparedStatement.setObject(1, (byte) 3);
        preparedStatement.setObject(2, "俞家伟");
        preparedStatement.setObject(3, 2);
        preparedStatement.setObject(4, 100);

        //执行插入sql语句(不用传参数)
        val result = preparedStatement.executeUpdate();

        //打印返回数据（插入的记录数量）
        System.out.println("成功插入数据数量：" + result);

        //返回生成的自增主键
        ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
        while (generatedKeys.next()) {
            long id = generatedKeys.getLong(1); // 注意：索引从1开始
            System.out.println("主键id：" + id);
        }

        preparedStatement.close();
        connection.close();
    }


    /**
     * 更新   一条数据
     */
    @Test
    public void test2() throws SQLException {
        //获取连接
        val connection = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
        //更新    sql语句
        String sql = "update students set name  = ? where id = ?";
        //创建预编译声明
        val preparedStatement = connection.prepareStatement(sql);
        //给查询条件赋值   索引从1开始
        preparedStatement.setObject(1, "胡为朱");
        preparedStatement.setObject(2, "2");

        //执行更新sql语句(不用传参数)
        val result = preparedStatement.executeUpdate();

        //打印返回数据（更新的记录数量）
        System.out.println("成功更新数据数量：" + result);

        preparedStatement.close();
        connection.close();
    }


    /**
     * 删除操作
     */
    @Test
    public void test3() throws SQLException {
        //获取连接
        val connection = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
        //删除    sql语句
        String sql = "delete from students where id = ?";
        //创建预编译声明
        val preparedStatement = connection.prepareStatement(sql);
        //给查询条件赋值   索引从1开始
        preparedStatement.setObject(1, "1");

        //执行更新sql语句(不用传参数)
        val result = preparedStatement.executeUpdate();

        //打印返回数据（删除的记录数量）
        System.out.println("成功删除数据数量：" + result);

        preparedStatement.close();
        connection.close();
    }

}
